const express = require("express");
const util = require("../common/util");
const AddressDB = require("../model/db/address");

/**
 * 新增地址
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应
 */
async function add(req, res) {
    let address = {
      userId: req.session.user.id,
      name: req.body.name,
      addressLine1: req.body.addressLine1,
      addressLine2: req.body.addressLine2,
      city: req.body.city,
      stateProvince: req.body.stateProvince,
      postalCode: req.body.postalCode,
      country: req.body.country,
      phoneNumber: req.body.phoneNumber
    }

    let db = AddressDB.getInstance();
    try {
      let result = await db.add(address);
      util.log(`增加地址：addressaffection:${result.affectedRows}`);
      res.json(util.FormatJSONData(200, `增加地址成功`, result));
    } catch (error) {
      // 在这里处理删除失败的情况
      util.log(`增加地址失败: ${error.message}`);
      res.json(util.FormatJSONData(500, `增加地址失败`, { error: error.message }));
    }
}

/**
 * 删除地址
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应
 */
async function remove(req, res) {
    let address = {
      addressId: req.params.id,
      userId: req.session.user.id
    }
    let db = AddressDB.getInstance();
    try {
      let result = await db.remove(address);
      util.log(`删除地址：addressId:${result.affectedRows}`);
      res.json(util.FormatJSONData(200, `删除地址成功`, result.affectedRows));
    } catch (error) {
      // 在这里处理错误
      util.log(`删除地址失败: ${error.message}`);
      res.json(util.FormatJSONData(500, `删除地址失败`, { error: error.message }));
    }
}

/**
 * 更新地址
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应
 */
async function update(req, res) {
    let address = {
      addressId: req.params.id,
      userId: req.session.user.id,
      name: req.body.name,
      addressLine1: req.body.addressLine1,
      addressLine2: req.body.addressLine2,
      city: req.body.city,
      stateProvince: req.body.stateProvince,
      postalCode: req.body.postalCode,
      country: req.body.country,
      phoneNumber: req.body.phoneNumber,
      // updatedTime: new Date()
    };

    // 验证请求数据
    if (!address.name || !address.addressLine1 || !address.city || !address.stateProvince || !address.postalCode || !address.country) {
      res.json(util.FormatJSONData(400, '无效的请求，缺少必要的字段'));
      return;
    }

    let db = AddressDB.getInstance();
    try {
      const changes = await db.update(address);
      if (changes === 0) {
        res.json(util.FormatJSONData(404, '更新失败，没有找到匹配的记录'));
      } else {
        util.log(`更新地址：changes=${changes}`);
        res.json(util.FormatJSONData(200, '更新地址成功', { changes }));
      }
    } catch (error) {
      // 记录更详细的错误信息
      util.log(`更新地址失败: ${error.message}`, {
        error,
        request: {
          method: req.method,
          url: req.url,
          body: req.body
        }
      });

      // 根据错误类型返回更具体的错误状态码
      if (error.code === 'ER_NOT_EXISTS') {
        res.json(util.FormatJSONData(404, '更新失败，没有找到匹配的记录'));
      } else if (error.code === 'ER_ACCESS_DENIED_ERROR') {
        res.json(util.FormatJSONData(403, '权限不足，无法更新地址'));
      } else {
        res.json(util.FormatJSONData(500, '更新地址失败', { error: error.message }));
      }
    }
}




/**  
 * 查找指定地址的信息  
 * @param {express.Request} req 请求  
 * @param {express.Response} res 响应  
 */  
async function find(req, res) {  
  // 从请求中获取地址ID和用户ID  
  let addressId = req.params.id;  
  let userId = req.session.user.id;  

  // 检查地址ID是否为数字  
  if (!Number.isInteger(parseInt(addressId, 10))) {  
      res.json(util.FormatJSONData(400, "addressId必须为数字"));  
      return;  
  }  

  // 获取数据库实例并执行查询  
  let db = AddressDB.getInstance();  
  try {  
      let result = await db.find({ addressId, userId }); // 假设您的查询方法接受一个对象  
      if (Array.isArray(result) && result.length === 0) {  
          // 如果没有找到地址，发送一个适当的响应  
          res.json(util.FormatJSONData(404, "查找失败，该地址不存在"));  
      } else {  
          // 如果找到地址，发送成功的响应  
          util.log(`查找地址成功：addressId:${addressId}`);  
          res.json(util.FormatJSONData(200, "查找地址成功", result));  
      }  
  } catch (error) {  
      // 如果查询过程中出现错误，发送一个错误响应  
      console.error("数据库查询错误:", error);  
      res.json(util.FormatJSONData(500, "内部服务器错误"));  
  }  
}

/**
* 获取个人地址列表
* @param {express.Request} req 请求
* @param {express.Response} res 响应
*/
async function findAllSelf(req, res) {
  const limit = req.query.limit ? parseInt(req.query.limit) : -1;
  const offset = req.query.offset ? parseInt(req.query.offset) : -1;
  let id = req.session.user.id;
  const db = AddressDB.getInstance();

  const result = await db.findAllSelf(limit, offset,id);

  //await db.close();
  util.logFormat(
    `获取【limit=${limit}&offset=${offset}】地址列表信息：%O`,
    result
  );
  res.json(util.FormatJSONData(200, `获取地址列表信息成功`, result));
}

/**
* 获取地址列表
* @param {express.Request} req 请求
* @param {express.Response} res 响应
*/
async function findAll(req, res) {
  const limit = req.query.limit ? parseInt(req.query.limit) : -1;
  const offset = req.query.offset ? parseInt(req.query.offset) : -1;

  const db = AddressDB.getInstance();
  const result = await db.findAll(limit, offset);

  //await db.close();
  util.logFormat(
    `获取【limit=${limit}&offset=${offset}】地址列表信息：%O`,
    result
  );
  res.json(util.FormatJSONData(200, `获取地址列表信息成功`, result));
}

/**    
 * 设置默认地址的路由处理函数    
 * @param {express.Request} req 请求    
 * @param {express.Response} res 响应    
 */  
async function setDefaultAddress(req, res) {   
    let address = {  
      addressId: req.params.id,  
      userId: req.session.user.id  
    };  
    let db = AddressDB.getInstance();  
    try {  
      let result = await db.setDefaultAddress(address);  
      if (!result.success) {  
        // 如果操作失败，返回错误信息  
        res.json(util.FormatJSONData(500, `设置默认地址失败`, result));  
      } else {         
        util.log(`设置默认地址结果: ${JSON.stringify(result)}`);  
        // 注意：这里不检查 affectedRows，因为我们相信数据库层的逻辑  
        res.json(util.FormatJSONData(200, `设置默认地址成功`, result));  
      }  
    } catch (error) {  
      // 在这里处理错误  
      util.log(`设置默认地址失败: ${error.message || error.toString()}`);  
      res.json(util.FormatJSONData(500, `设置默认地址失败`, { error: error.message || error.toString() }));  
    }    
}

module.exports = {
  add,
  remove,
  find,
  findAll,
  update,
  setDefaultAddress,
  findAllSelf,
};
